package com.atguigu.juc.date930;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @Author: shenhao
 * @CreatTime: 2024/9/30 21:22
 * @Version: 1.0
 * 锁降级 演示
 * 请注意，在锁降级期间，我们要确保数据的一致性，即在降级为读锁之前和之后都可以正确读取数据。
 * 当作者线程写入完毕,然后第一时间要获取读锁,(在写锁没有释放的时候),就是锁降级,
 * 当需要微信发朋友圈后,自己第一个看到,就需要使用锁降级, 微信朋友圈自己第一个看见,
 * 朋友们延后一段时间后看见,这就是最终一致性
 */
public class ReadWriteLockDemo2 {
    private Map<String,String> map=new HashMap<String,String>();
    private  ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    Lock readLock = lock.readLock();
    Lock writeLock =lock.writeLock();
    // 正常锁降级
    public void test(){
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"获取到写锁,开始写操作=====");
            map.put(Thread.currentThread().getName(), Thread.currentThread().getName());
            System.out.println("--------------------------");
            System.out.println("写操作结束,获取读锁");
            System.out.println("--------------------------");
            //读数据
            //可以插入其他的读线程（因为读读可并发），从而提高应用程序的执行效率
            readLock.lock();
            System.out.println(Thread.currentThread().getName()+"读取到的自己的签名"+map.get(Thread.currentThread().getName()));
            System.out.println("---------------------------");
            System.out.println("读取完毕, 要将读锁释放");
        } finally {
            readLock.unlock();// 必须要将读锁也释放了,要不然堵塞下一个线程了
            writeLock.unlock();
        }
    }
    // 正常读操作
    public String readMap(){
        readLock.lock();
        try {
            return map.get(Thread.currentThread().getName());
        } finally {
            readLock.unlock();
        }
    }


    public static void main(String[] args) {
        ReadWriteLockDemo2 rw = new ReadWriteLockDemo2();
        //10个线程即写又读
        for (int i = 0; i < 10; i++) {
            Thread t1=new Thread(()->{
                rw.test();
            },String.valueOf(i));
            t1.start();
        }
    }
}
